最近幫學長做實驗發現學長製作的環境中都會有一個圓圈形成的進度條,方便我知道要維持某一個姿勢或是動作多久才算完成。這邊我請教學長後也試著實作一下,或許未來在實驗中也可能會使用到。那這邊我會以假裝頭戴HMD,看到某一個Target 物件就開始累積進度條的數值,並且透過兩個同樣是Circle Image 的方式顯示目前進度,我個人覺得很有趣XD。
今天也會使用到 Debug.DrawRay 結合 RaycastHit 來確認當前是否有觸發到物件,並改變該Ray 的樣貌。讓我們開始吧。
首先創建一個 Sphere 並且改名為 User,接著去設計一下外觀。如下類似一個人帶著 HMD。
接下來我們新增一個文本,LookAtCheck.cs。新增到該User 的Inspector中。
接著設定幾個 Target Object 在User 的前方。
void gazeHit()
{
RaycastHit hit;
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity))
{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
Debug.Log("Hit something!");
}else{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 1000, Color.white);
Debug.Log("Hit nothing!");
}
}
回到 Unity 後記得要注意到開啟Scene 右上角的 Gizmos,若沒開啟就無法出現我們需要的射線樣式。
接下來你就可以在執行的過程中看到 Scene 出現一條很細的線。
若接觸到任何物件就會顯示成黃色的。
首先到 Unity 選擇我們的 selectCircle,看到 Inspector 的地方調整成入下的樣子。最重要的地方就是請將Image Type 設定成 Filled。
接下來新增一個文本 FilledCircle.cs 到我們 SelectionCircle 空白物件中。
開始撰寫該 FilledCircle 文本,這邊宣告一個 public 計數的函數,如果說當Ray 射線觸發到某個物件的時候就會每秒進行累積,我這邊設定 5f就是進度條累積到全滿會需要 5 秒的時間。
public void filledCircle(){
if(filledT < 5f)
{
filledT += Time.deltaTime;
}
}
redCircleFilled.GetComponent<Image>().fillAmount = filledT;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FilledCircle : MonoBehaviour
{
public float filledT = 0f;
public GameObject redCircleFilled;
void Update()
{
redCircleFilled.GetComponent<Image>().fillAmount = filledT;
}
public void filledCircle(){
if(filledT < 5f)
{
filledT += Time.deltaTime;
}else{
Debug.Log("Success to select!");
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LookAtCheck : MonoBehaviour
{
RaycastHit hit;
public float circleFilled = 0f;
public FilledCircle redcircle;
void Update()
{
gazeHit();
}
void gazeHit()
{
RaycastHit hit;
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity))
{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
redcircle.filledCircle();
//Debug.Log("Hit something!");
}else{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 1000, Color.white);
redcircle.filledT = 0f;
//Debug.Log("Hit nothing!");
}
}
}
沒有看到任何物件或離開Target 目標時不會累積。
看到物件時中央的Red Circle 開始累積